<?php

namespace app\admin\controller;

use app\admin\common\controller\Common;
use app\common\model\Nav as NavModel;
use think\Request;
use think\Validate;

// 导航栏
class Nav extends Common
{
    /**
     * 显示资源列表
     *
     * @return \think\Response
     */
    public function index()
    {
        // 获取全部数据
        $datas = NavModel::where('parent_id', 0)->order('sorting')->paginate(10)->each(function ($item, $key) {
            // 获取子分类
            $childrens = NavModel::where('parent_id', $item['id'])->order('sorting')->all();

            // 设置子分类
            $item['childrens'] = $childrens;

            // 返回
            return $item;
        });

        // 获取分页显示
        $page = $datas->render();

        // 模板变量赋值
        $this->assign(['datas' => $datas, 'page' => $page]);

        // 视图渲染
        return view();
    }

    /**
     * 保存新建的资源
     *
     * @param  \think\Request  $request
     * @return \think\Response
     */
    public function save(Request $request)
    {
        // 保存Post数据
        $post = $request->post();

        // 创建验证
        $validate = Validate::make([
            'name' =>  'require|min:2',
        ]);

        // 判断验证是否成功
        if ($validate->check($post)) {  // 成功
            // 查找数据
            $data = NavModel::where('name', addslashes($post['name']))->find();

            // 是否存在数据
            if (!$data) {  // 不存在
                // 设置父级编号
                $parent_id = isset($post['parent_id']) ? $post['parent_id'] : 0;

                // 获取数据数量
                $count = NavModel::where('parent_id', $parent_id)->count();

                // 设置排序
                $post['sorting'] = ++$count;
                
                // 新增数据
                $result = NavModel::create($post, true);

                // 返回Json数据
                return $result ? json(['message' => '添加成功', 'type' => 'success', 'state' => 200]) : json(['message' => '添加失败', 'type' => 'success', 'state' => 400]);
            } else {    // 存在
                // 返回Json数据
                return json(['message' => '导航栏目已存在', 'type' => 'warning', 'state' => 400]);
            }
        } else {    // 失败
            // 抛出错误信息
            throw new \Exception($validate->getError());
        }
    }

    /**
     * 显示指定的资源
     *
     * @param  int  $id
     * @return \think\Response
     */
    public function read($id)
    {
        // 获取单个数据
        $data = NavModel::get(array($id));

        // 返回Json数据
        return $data ? json(['data' => $data, 'message' => '获取数据成功', 'type' => 'success', 'state' => 200]) : json(['data' => $data, 'message' => '获取数据失败', 'type' => 'error', 'state' => 400]);
    }

    /**
     * 保存更新的资源
     *
     * @param  \think\Request  $request
     * @param  int  $id
     * @return \think\Response
     */
    public function update(Request $request, $id)
    {
        // 保存Put数据
        $put = $request->put();

        // 验证
        $validate = $this->validate($put, 'app\admin\validate\Nav');

        // 判断是否验证成功
        if ($validate === true) {    // 成功
            // 查找数据
            $data = NavModel::where('name', $put['name'])->find();

            // 是否不存在此数据或更新当前数据
            if (!$data || $data['id'] == $id) { // 不存在
                // 设置更新条件
                $put['id'] = $id;
                
                // 更新数据
                $result = NavModel::update($put, true);

                // 返回Json数据
                return $result ? json(['message' => '更新成功', 'type' => 'success', 'state' => 200]) : json(['message' => '更新失败', 'type' => 'error', 'state' => 400]);
            } else { // 存在
                // 返回Json数据
                return json(['message' => '导航栏目已存在', 'type' => 'warning', 'state' => 400]);
            }
        } else {    // 失败
            // 抛出错误信息
            throw new \Exception($validate);
        }
    }

    /**
     * 删除指定资源
     *
     * @param  int  $id
     * @return \think\Response
     */
    public function delete($id)
    {
        // 删除数据
        $result = NavModel::destroy(array($id));

        // 返回Json数据
        return $result ? json(['message' => '删除成功', 'type' => 'success', 'state' => 200]) : json(['message' => '删除失败', 'type' => 'error', 'state' => 400]);
    }

    /**
     * 保存更新的排序
     *
     * @param  \think\Request  $request
     * @param  int  $id
     * @return \think\Response
     */
    public function update_sorting(Request $request, $id)
    {
        // 保存Put数据
        $put = $request->only('sorting', 'put');

        // 设置更新条件
        $put['id'] = $id;

        // 更新数据
        $result = NavModel::update($put, true);

        // 返回Json数据
        return $result ? json(['message' => '更新排序成功', 'type' => 'success', 'state' => 200]) : json(['message' => '更新排序失败', 'type' => 'error', 'state' => 400]);
    }

    /**
     * 保存更新的状态
     *
     * @param  \think\Request  $request
     * @param  int  $id
     * @return \think\Response
     */
    public function update_status(Request $request, $id)
    {
        // 保存Put数据
        $put = $request->only('status', 'put');

        // 设置更新条件
        $put['id'] = $id;

        // 更新数据
        $result = NavModel::update($put, true);

        // 返回Json数据
        return $result ? json(['message' => '更新状态成功', 'type' => 'success', 'state' => 200]) : json(['message' => '更新状态失败', 'type' => 'error', 'state' => 400]);
    }
}
